home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1999 / MacHack 1999.toast / The Hacks / Y2K Fix / src / Y2K Fix.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-12-17  |  2.8 KB  |  148 lines  |  [TEXT/CWIE]

  1. // The Y2K Fix Hack by Mark Darling
  2. // Use this only as a dare - it hasn't been well tested.  I won't be responsible for
  3. // anything that goes wrong. 
  4.  
  5. #include <Types.h>
  6. #include <Memory.h>
  7. #include <A4Stuff.h>
  8. #include <SetUpA4.h>
  9. #include <Quickdraw.h>
  10. #include <LowMem.h>
  11. #include <Errors.h>
  12. #include <Gestalt.h>
  13. #include <Resources.h>
  14. #include <Events.h>
  15. #include <Windows.h>
  16. #include <Retrace.h>
  17. #include <Lowmem.h>
  18. #include <MixedMode.h>
  19.  
  20. #define FALSE                false
  21. #define TRUE                true
  22. #define NIL                    0L
  23.  
  24.  
  25. #define kInitRezType        'INIT'
  26. #define kInitRezID            300
  27.  
  28. #define kMinSystemVersion    (0x0603)
  29.  
  30.  
  31. // ShowInit 
  32. #define kOkMac    128
  33.  
  34.  
  35. struct NInitGlobals
  36. {
  37.     SysEnvRec        gSystemInfo;
  38.     long            gInfo;        // 1=68k,2=PPC
  39.     VBLTask            gVBLTask;
  40.     unsigned long   gOffset;
  41.     unsigned long   gDelay;
  42. };
  43. typedef struct NInitGlobals NInitGlobals;
  44.  
  45. NInitGlobals                *gP;
  46.  
  47. OSErr DoInstall( void);
  48. pascal void DoVBL(void);
  49.  
  50.  
  51. extern void ShowIconFamilyAnim(short iconId, short cnt);
  52. extern void ShowIconFamily(short iconId);
  53.  
  54. void main( void )
  55. {
  56.     long        oldA4;
  57.     Handle        initH = nil;        /* Handle to our own INIT resource */
  58.     OSErr        err = noErr;
  59.     
  60.     oldA4 = SetCurrentA4();            /* Get the proper value of A4 into A4 */
  61.     RememberA4();                    /* save into self-modifying code */
  62.  
  63.     gP = (NInitGlobals*) NewPtrSysClear( sizeof(NInitGlobals));
  64.     if ( !gP ) {
  65.         err = memFullErr;
  66.         goto DONE;
  67.     }
  68.     
  69.     err = SysEnvirons( 1, &gP->gSystemInfo );
  70.     if ( err )
  71.         goto DONE;
  72.       if ( gP->gSystemInfo.systemVersion < kMinSystemVersion ) {
  73.          err = -1;
  74.          goto DONE;
  75.      }
  76.  
  77.     initH = Get1Resource( kInitRezType, kInitRezID );
  78.     if ( !initH ) {
  79.         err = resNotFound;
  80.         goto DONE;
  81.     }
  82.  
  83.     err = Gestalt( gestaltSysArchitecture, &gP->gInfo );
  84.     if ( err) gP->gInfo = gestalt68k;
  85.         
  86.     err = DoInstall();    
  87.  
  88.     DONE:
  89.     if ( err ) {
  90.         if ( gP )
  91.             DisposePtr( (Ptr)gP );
  92.     } else {
  93.         ShowIconFamilyAnim( kOkMac, 1 );    
  94.         DetachResource( initH);    
  95.         MoveHHi( (Handle)initH); HLock( (Handle)initH);
  96.     }
  97.     
  98.     RestoreA4( oldA4 );                    /* restore previous value of A4 */
  99. }
  100.  
  101. #define kVBLStartInterval    50    // Ticks???
  102.  
  103. OSErr DoInstall( void )
  104. {
  105.     long    oldA4;
  106.     NInitGlobals *locGPtr;
  107.  
  108.     oldA4 = SetUpA4();    
  109.     locGPtr = gP;
  110.     RestoreA4( oldA4 );    
  111.  
  112.     locGPtr->gVBLTask.qLink        = 0;
  113.     locGPtr->gVBLTask.qType        = vType;
  114.     locGPtr->gVBLTask.vblAddr    = DoVBL;
  115.     locGPtr->gVBLTask.vblCount    = kVBLStartInterval;
  116.     locGPtr->gVBLTask.vblPhase    = 0;
  117.         
  118.     VInstall( (QElemPtr)&locGPtr->gVBLTask);
  119.     
  120.     gP->gOffset = 0;
  121.     
  122.     return noErr;
  123. }
  124.  
  125. VBLTask    *GetVBLInfo( void ) = { 0x2008 };        /* MOVE.L    A0,D0 */
  126.  
  127. #define kY2K_Ticks        0xB492F3FF
  128.  
  129. pascal void DoVBL(void)
  130. {
  131.     VBLTask    *curVBLInfo;
  132.     unsigned long    cmpT;
  133.     
  134.     curVBLInfo = GetVBLInfo();
  135.     
  136.     curVBLInfo->vblCount    = kVBLStartInterval;
  137.     
  138.     cmpT = kY2K_Ticks - *(unsigned long*)0x20C;
  139.     
  140.     // If we have passed the Y2K point, reset the time to 1900.
  141.     if ( cmpT <= 0 )
  142.     {
  143.         *(unsigned long*)0x20C = kY2K_Ticks - 60;
  144.     }
  145.  
  146.      return;
  147. }
  148.